package org.su.generalmvc.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

/**
 * 数据库操作接口
 * 
 * @author leimingbo
 * 
 */
public interface IDao {
	
	public static final String TRANS_LEAVEL = "trans_leavel";
	
	public static final String DAO_KEY = "dao_key";
	
	public Connection getConnection();
	
	/**
	 * 查询
	 * <p>
	 * 传入的Paging实例已包含分页信息，不用在sql语句里写入分页部分，默认为从0条记录开始的10条记录，若查询的记录为10条以后的，须设置相应的当前页数(currentPage)；若每次取得的记录数为其他数目，则需要设置每页记录数(pageResults)
	 * </p>
	 * 
	 * @param paging Paging对象
	 * @param sql SQL语句
	 * @param params 参数列表
	 * @return
	 */
	public ResultSet find(Paging paging, String sql, Object... params);
	
	/**
	 * 查询
	 * <p>
	 * 传入的Paging实例已包含分页信息，不用在sql语句里写入分页部分，默认为从0条记录开始的10条记录，若查询的记录为10条以后的，须设置相应的当前页数(currentPage)；若每次取得的记录数为其他数目，则需要设置每页记录数(pageResults)
	 * </p>
	 * 
	 * @param paging Paging对象
	 * @param sqlBuilder 数据库模板工具类
	 * @return
	 */
	public ResultSet find(Paging paging, SqlBuilder sqlBuilder);

	/**
	 * 查询
	 * <p>
	 * 查询所有记录集，无分页
	 * </p>
	 * 
	 * @param sql SQL语句
	 * @param params 参数列表
	 * @return
	 */
	public ResultSet findAll(String sql, Object... params);
	
	/**
	 * 查询
	 * <p>
	 * 查询所有记录集，无分页
	 * </p>
	 * 
	 * @param sqlBuilder 数据库模板工具类
	 * @return
	 */
	public ResultSet findAll(SqlBuilder sqlBuilder);

	/**
	 * 新增
	 * 
	 * @param sql
	 *            SQL语句
	 * @param params
	 *            参数列表
	 * @return 影响的行数
	 */
	public int insert(String sql, Object... params);

	/**
	 * 新增
	 * 
	 * @param sqlBuilder
	 *            数据库模板工具类
	 * @return 影响的行数
	 */
	public int insert(SqlBuilder sqlBuilder);

	/**
	 * 修改
	 * 
	 * @param sql
	 *            SQL语句
	 * @param params
	 *            参数列表
	 * @return 影响的行数
	 */
	public int update(String sql, Object... params);

	/**
	 * 修改
	 * 
	 * @param sqlBuilder
	 *            数据库模板工具类
	 * @return 影响的行数
	 */
	public int update(SqlBuilder sqlBuilder);

	/**
	 * 删除
	 * 
	 * @param sqlBuilder
	 *            数据库模板工具类
	 * @return 影响的行数
	 */
	public int delete(SqlBuilder sqlBuilder);

	/**
	 * 删除
	 * 
	 * @param sql
	 *            SQL语句
	 * @return 影响的行数
	 */
	public int delete(String sql);

	/**
	 * 删除
	 * 
	 * @param sql
	 *            SQL语句
	 * @param params
	 *            参数列表
	 * @return 影响的行数
	 */
	public int delete(String sql, Object... params);

	/**
	 * 关闭相关资源
	 * 
	 * @deprecated 改用 close()
	 * @param commit
	 *            提交判断
	 */
	public void closeDao(boolean commit);

	/**
	 * 关闭Dao，在结束使用时必须保证调用
	 * 
	 */
	public void close();
	
	/**
	 * 关闭结果集
	 * @param rs 结果集
	 */
	public void close(ResultSet rs);

	/**
	 * 关闭编译
	 * @param preparedStatement
	 */
	public void close(Statement statement);
	
	/**
	 * 开启事务，事务自动处理
	 * @deprecated 改用 beginTrans
	 */
	public void openTransaction();
	
	/**
	 * 关闭事务，手动操作事务
	 * @deprecated
	 */
	public void closeTransaction();
	
	/**
	 * 启动事务，默认用 TRANSACTION_READ_COMMITTED 
	 * @param 
	 */
	
	public void startTrans();
	/**
	 * 根据事务级别启动事务
	 * @param transLevel 事务级别，Connection.TRANS_XXX
	 */
	public void startTrans(int transLevel);
	
	/**
	 * 结束事务
	 */
	public void endTrans(boolean commit);
	
	
	/**
	 * 结束事务和关闭连接
	 */
	public void endTransAndClose(boolean commit);
	
	/**
	 * 创建一个预编译对象
	 * @param sql SQL语句
	 */
	public PreparedStatement createPreparedStatement(String sql);
	
	/**
	 * 操作预编译对象
	 * @param objects
	 * @return 影响的行数
	 */
	public int execute(PreparedStatement statement, Object... objects);
	
	/**
	 * 设置事务回滚标志
	 * @deprecated 改用 endTrans(false)
	 */
	public void rollback();
	
	/**
	 * 查询单一String数据值
	 * <p>
	 * 查询所有记录集，无分页
	 * </p>
	 * 
	 * @param sql SQL语句，只有第一列要效
	 * @param params 参数列表
	 * @return 返回结果值
	 */
	public String queryString(String sql, Object... params);
	/**
	 * 查询单一Long数据值
	 * <p>
	 * 查询所有记录集，无分页
	 * </p>
	 * 
	 * @param sql SQL语句，只有第一列要效
	 * @param params 参数列表
	 * @return 返回0可能是空值
	 */
	public long queryLong(String sql, Object... params);
	
	/**
	 * 查询单一Integer数据值
	 * <p>
	 * 查询所有记录集，无分页
	 * </p>
	 * 
	 * @param sql SQL语句，只有第一列要效
	 * @param params 参数列表
	 * @return 返回0可能是空值
	 */
	public int queryInt(String sql, Object... params);
	/**
	 * 查询单一Short数据值
	 * <p>
	 * 查询所有记录集，无分页
	 * </p>
	 * 
	 * @param sql SQL语句，只有第一列要效
	 * @param params 参数列表
	 * @return 返回0可能是空值
	 */
	public short queryShort(String sql, Object... params);
	/**
	 * 查询单一byte数据值
	 * <p>
	 * 查询所有记录集，无分页
	 * </p>
	 * 
	 * @param sql SQL语句，只有第一列要效
	 * @param params 参数列表
	 * @return 返回0可能是空值
	 */
	public byte queryByte(String sql, Object... params);
	
	
	/**
	 * 查询单一float数据值
	 * <p>
	 * 查询所有记录集，无分页
	 * </p>
	 * 
	 * @param sql SQL语句，只有第一列要效
	 * @param params 参数列表
	 * @return 返回0可能是空值
	 */
	public float queryFloat(String sql, Object... params);
	
	/**
	 * 获取当前事务级别
	 * @return
	 */
	public int getTransLevel();

	void forceClose();

	public void addRefCount();
}

